package com.woldier.algorithm.hashing;

import java.util.HashMap;
import java.util.Map;

/**
 * description
 * <p>
 * 给你一个字符串 paragraph 和一个表示禁用词的字符串数组 banned ，返回出现频率最高的非禁用词。题目数据 保证 至少存在一个非禁用词，且答案 唯一 。
 * <p>
 * paragraph 中的单词 不区分大小写 ，答案应以 小写 形式返回。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：paragraph = "Bob hit a ball, the hit BALL flew far after it was hit.", banned = ["hit"]
 * 输出："ball"
 * 解释：
 * "hit" 出现了 3 次，但它是禁用词。
 * "ball" 出现了两次（没有其他单词出现这么多次），因此它是段落中出现频率最高的非禁用词。
 * 请注意，段落中的单词不区分大小写，
 * 标点符号会被忽略（即使它们紧挨着单词，如 "ball,"），
 * 并且尽管 "hit" 出现的次数更多，但它不能作为答案，因为它是禁用词。
 * 示例 2：
 * <p>
 * 输入：paragraph = "a.", banned = []
 * 输出："a"
 * <p>
 * <p>
 * 提示：
 * <p>
 * 1 <= paragraph.length <= 1000
 * paragraph 由英文字母、空格 ' '、和以下符号组成："!?',;."
 * 0 <= banned.length <= 100
 * 1 <= banned[i].length <= 10
 * banned[i] 仅由小写英文字母组成
 *
 * @author: woldier wong
 * @date: 2023/12/26$ 17:04$
 */
public class leetcode_819_mostCommonWord {
    /**
     * description
     * <p>
     * 预处理: 首先, 先要做的就是将所有字符转换为小写的, 然后将符号给去除掉
     * <p>
     * 然后就是通过hash表计数, 这一块没什么说的
     *
     * @param paragraph
     * @param banned
     * @return java.lang.String
     * @author: woldier wong
     * @date: 2023/12/26 17:05
     */
    public String mostCommonWord(String paragraph, String[] banned) {
        paragraph = paragraph.toLowerCase();  //转小写字符
        paragraph = paragraph.replaceAll("[^a-zA-Z0-9]", " ");  //去除符号

        String[] strings = paragraph.split("\\s+"); // 分割

        Map<String, Integer> map = new HashMap<>();
        final String[] bannedF = banned;
        String resS = null;
        int count = 0;
        for (String s : strings) {

            if(isBanned(s,banned)) continue; //如果是被禁止的单词 ,什么也不做
            if(!map.containsKey(s)){ //如果为第一次
                map.put(s,1);
            }
            Integer cc = map.get(s); //得到计数
            cc+=1; //计数加一
            if(cc>=count){ //如果本单词出现的频次较高
                count = cc;
                resS = s;
            }
            map.put(s,cc); //更新map中的计数
        }
        return resS;

    }

    private boolean isBanned(String s, String[] banned) {
        for (String s1 : banned) {
            if (s1.equals(s)) return true;
        }
        return false;
    }
}
